﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO.SensorServices.Rfid.Client;
using Microsoft.SensorServices.Rfid;
using Microsoft.SensorServices.Rfid.Design;
using Microsoft.SensorServices.Rfid.Management;
using Microsoft.SensorServices.Rfid.Utilities;
using Microsoft.Rfid.Design;

namespace Securfid
{
    class ReaderRFID
    {
        public static void ReInit(string devicename)
        {
            using (DeviceConnection connection = new DeviceConnection(devicename))
            {
                //Enleve le bug du lecteur resté connecté en lecture
                DeviceManagerProxy proxy = new DeviceManagerProxy("localhost");
                string[] devices = { devicename };
                Microsoft.SensorServices.Rfid.Runtime.DeviceStatus[] status = new Microsoft.SensorServices.Rfid.Runtime.DeviceStatus[] { null };
                status = proxy.GetDeviceStatus(devices);

                if (status[0].ConnectionState.ToString() == "Open")
                {
                    proxy.DisableDevice(devicename);
                    proxy.EnableDevice(devicename);
                }

                //Met l'alarme à OFF (1) au cas où elle serait resté active
                connection.Open();
                byte[] off = new byte[] { 1 };
                connection.SetProperty("GPO_1", Microsoft.SensorServices.Rfid.Dspi.StandardDevicePropertyGroups.Source, Microsoft.SensorServices.Rfid.Dspi.SourcePropertyGroup.PortOutputValue, off, null);
                connection.Close();
            }
        }

        public static List<Lectures> LectureReader(string devicename, string local, DateTime heureactuelle)
        {
            //Initialise TagMEM
            List<Lectures> TagMEM = new List<Lectures>();

            using (DeviceConnection connection = new DeviceConnection(devicename))
            {
                //Ouvre une connection avec le lecteur
                connection.Open();
                
                //Fait une lecture des tags et les met dans l'objet TagReadEvent.
                ICollection<TagReadEvent> tres = connection.GetTags(TagDataSelector.All);

                //Ferme la connection avec le lecteur
                connection.Close();

                //Met en mémoire les lectures de tag uniques dans une liste `ListeTag`
                if (tres.Count != 0)                                        //Si le reader lis au moins un tag alors continu
                {
                    List<string> tagList = new List<string>();              //Initialise la liste des tags lus
                    foreach (TagReadEvent tre in tres)                      //Ajoute les tagId dans la liste "tagList"
                    {
                        byte[] tagId = tre.GetId();
                        string tagString = BitConverter.ToString(tagId);
                        tagList.Add(tagString);                             //Convertis les ID de byte[] en string
                    }
                    IEnumerable<string> tagUniques = tagList.Distinct();    //Enleve les doublons

                    foreach (string tagUnique in tagUniques)                //Met les tags uniques dans une liste d'objet Lectures
                    {
                        Lectures resultat = new Lectures();
                        resultat.Initialise(0, tagUnique.Replace("-", string.Empty), local, heureactuelle.ToString(), null, false, 0, 0);
                        TagMEM.Add(resultat);
                    }
                }
            }
            return TagMEM;
        }
    }
}
